package com.videoweb.domain.conversation.valueobject;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.HashMap;

/**
 * 对话上下文值对象
 * 封装对话的上下文信息和状态
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ConversationContext {
    
    private String summary; // 对话摘要
    private Map<String, Object> userPreferences; // 用户偏好
    private Map<String, Object> sessionData; // 会话数据
    private String currentTopic; // 当前话题
    private Integer contextWindow; // 上下文窗口大小
    private LocalDateTime lastSummaryAt; // 最后总结时间
    private Double relevanceScore; // 相关性评分
    
    /**
     * 创建默认上下文
     */
    public static ConversationContext createDefault() {
        return ConversationContext.builder()
                .userPreferences(new HashMap<>())
                .sessionData(new HashMap<>())
                .contextWindow(10) // 默认保持10条消息的上下文
                .relevanceScore(1.0)
                .build();
    }
    
    /**
     * 创建代码生成上下文
     */
    public static ConversationContext createForCodeGeneration() {
        Map<String, Object> codePreferences = new HashMap<>();
        codePreferences.put("language", "java");
        codePreferences.put("style", "spring_boot");
        codePreferences.put("documentation", true);
        
        return ConversationContext.builder()
                .userPreferences(codePreferences)
                .sessionData(new HashMap<>())
                .currentTopic("代码生成")
                .contextWindow(15) // 代码生成需要更长的上下文
                .relevanceScore(1.0)
                .build();
    }
    
    /**
     * 更新摘要
     */
    public void updateSummary(String newSummary) {
        this.summary = newSummary;
        this.lastSummaryAt = LocalDateTime.now();
    }
    
    /**
     * 添加用户偏好
     */
    public void addUserPreference(String key, Object value) {
        if (this.userPreferences == null) {
            this.userPreferences = new HashMap<>();
        }
        this.userPreferences.put(key, value);
    }
    
    /**
     * 获取用户偏好
     */
    public Object getUserPreference(String key) {
        return this.userPreferences != null ? this.userPreferences.get(key) : null;
    }
    
    /**
     * 添加会话数据
     */
    public void addSessionData(String key, Object value) {
        if (this.sessionData == null) {
            this.sessionData = new HashMap<>();
        }
        this.sessionData.put(key, value);
    }
    
    /**
     * 获取会话数据
     */
    public Object getSessionData(String key) {
        return this.sessionData != null ? this.sessionData.get(key) : null;
    }
    
    /**
     * 更新当前话题
     */
    public void updateTopic(String newTopic) {
        this.currentTopic = newTopic;
    }
    
    /**
     * 调整上下文窗口大小
     */
    public void adjustContextWindow(Integer newSize) {
        if (newSize != null && newSize > 0 && newSize <= 50) {
            this.contextWindow = newSize;
        }
    }
    
    /**
     * 检查是否需要总结
     */
    public boolean needsSummary() {
        if (this.lastSummaryAt == null) {
            return true;
        }
        
        // 如果距离上次总结超过1小时，需要重新总结
        return LocalDateTime.now().minusHours(1).isAfter(this.lastSummaryAt);
    }
    
    /**
     * 获取编程语言偏好
     */
    public String getPreferredLanguage() {
        Object language = getUserPreference("language");
        return language != null ? language.toString() : "java";
    }
    
    /**
     * 设置编程语言偏好
     */
    public void setPreferredLanguage(String language) {
        addUserPreference("language", language);
    }
    
    /**
     * 检查是否启用文档生成
     */
    public boolean isDocumentationEnabled() {
        Object documentation = getUserPreference("documentation");
        return documentation != null && (Boolean) documentation;
    }
    
    /**
     * 设置文档生成偏好
     */
    public void setDocumentationEnabled(boolean enabled) {
        addUserPreference("documentation", enabled);
    }
    
    /**
     * 获取代码风格偏好
     */
    public String getCodeStyle() {
        Object style = getUserPreference("style");
        return style != null ? style.toString() : "standard";
    }
    
    /**
     * 设置代码风格偏好
     */
    public void setCodeStyle(String style) {
        addUserPreference("style", style);
    }
    
    /**
     * 更新相关性评分
     */
    public void updateRelevanceScore(Double score) {
        if (score != null && score >= 0.0 && score <= 1.0) {
            this.relevanceScore = score;
        }
    }
    
    /**
     * 检查上下文是否有效
     */
    public boolean isValid() {
        return contextWindow != null && contextWindow > 0 
            && relevanceScore != null && relevanceScore >= 0.0 && relevanceScore <= 1.0;
    }
    
    /**
     * 复制上下文
     */
    public ConversationContext copy() {
        return ConversationContext.builder()
                .summary(this.summary)
                .userPreferences(this.userPreferences != null ? new HashMap<>(this.userPreferences) : new HashMap<>())
                .sessionData(this.sessionData != null ? new HashMap<>(this.sessionData) : new HashMap<>())
                .currentTopic(this.currentTopic)
                .contextWindow(this.contextWindow)
                .lastSummaryAt(this.lastSummaryAt)
                .relevanceScore(this.relevanceScore)
                .build();
    }
}